//
//  SQLiteVC.m
//  SYPerfectDemo
//
//  Created by Lssyyy on 2018/5/3.
//  Copyright © 2018年 Lssyyy. All rights reserved.
//

//FMDB
//优点:
//对多线程的并发操作进行处理，所以是线程安全的；
//以OC的方式封装了SQLite的C语言API，使用起来更加的方便；
//FMDB是轻量级的框架，使用灵活。
//缺点:
//因为它是OC的语言封装的，只能在ios开发的时候使用，所以在实现跨平台操作的时候存在局限性。


/*FMDatabase*/
//FMDatabase对象就代表一个单独的SQLite数据库，用来执行SQL语句
/*FMResultSet*/
//使用FMDatabase执行查询后的结果集
/*FMDatabaseQueue*/
//用于在多线程中执行多个查询或更新，它是线程安全的


//一切不是SELECT命令的命令都视为更新。这包括 CREAT,UPDATE,INSERT,ALTER,BEGIN,COMMIT,DETACH,DELETE,DROP,END,EXPLAIN,VACUUM,REPLACE等
//executeUpdate:不确定的参数用？来占位（后面参数必须是oc对象!! ;代表语句结束）

#import "SQLiteVC.h"
#import "FMDB.h"
#import "SQLiteView.h"
#define kSYDBCachePath @"/Users/lssyyy/Desktop"
@interface SQLiteVC ()<SQLiteViewDelegate>
@property (nonatomic,strong) FMDatabase *db;
@property (nonatomic,strong) FMDatabaseQueue *DataQueue;
@property (nonatomic,strong) SQLiteView *sqliteView;
@end

@implementation SQLiteVC

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

- (SQLiteView *)sqliteView{
    if (!_sqliteView) {

        _sqliteView = [SQLiteView SQLiteView];
        _sqliteView.delegate = self;
    }
    return _sqliteView;
}
//数据库插入方法
- (void)sqlAddMethod:(SQLiteStudentModel *)model{

    [_DataQueue inDatabase:^(FMDatabase * _Nonnull db) {
      BOOL suc = [db executeUpdate:@"INSERT INTO student (name,age,score) values(?,?,?)",model.name,@(model.age),@(model.score)];
        if (suc) {
            NSLog(@"可以");
        }
    }];
}

//数据库删除方法
- (void)sqlDelMethod:(SQLiteStudentModel *)model{
    
    [_DataQueue inDatabase:^(FMDatabase * _Nonnull db) {
        BOOL success = [db executeUpdate:@"Delete from student where id = ? and name = ? and age = ? and score= ?",@(model.id),model.name,@(model.age),@(model.score)];
        if (success) {
            NSLog(@"删除成功");
        }
    }];
}

//数据库更新方法
- (void)sqlChangeMethod:(SQLiteStudentModel *)model{
    [_DataQueue inDatabase:^(FMDatabase * _Nonnull db) {
        BOOL success = [db executeUpdate:@"update student set score = ? where name = ?",@(model.score),model.name];
        if (success) {
            NSLog(@"修改成功");
        }
    }];
}

//数据库查找方法
- (void)sqlLookMethod:(SQLiteStudentModel *)model{
    [_DataQueue inDatabase:^(FMDatabase * _Nonnull db) {
        FMResultSet *result = [db executeQuery:@"SELECT *FROM STUDENT WHERE name = ?",model.name];
        while ([result next]) {
            int studentId = [result intForColumn:@"id"];
            int studentAge = [result intForColumn:@"age"];
            NSString *studentName = [result objectForColumn:@"name"];
            float studentScore = [result doubleForColumn:@"score"];
            SQLiteStudentModel *newModel = [[SQLiteStudentModel alloc]init];
            newModel.id = studentId;
            newModel.age = studentAge;
            newModel.name = studentName;
            newModel.score = studentScore;
            [_sqliteView showResult:newModel];
        }
    }];
}

- (void)updateSqlString:(SQLiteStudentModel *)model{
    switch (model.sqlType) {
        case 0:{
            [self sqlAddMethod:model];
        }
            break;
        case 1:{
            [self sqlDelMethod:model];
        }
            break;
        case 2:{
            [self sqlChangeMethod:model];
        }
            break;
        case 3:{
            [self sqlLookMethod:model];
        }
            break;
        default:
            break;
    }
   
}

- (void)config{
    //1.数据库路径
    NSString * path = [kSYDBCachePath stringByAppendingPathComponent:@"111.sqlite"];
    NSLog(@"%@",path);
    //2.获取数据库对象(不能在多个线程中共同一个FMDatabase对象并且在多个线程中同时使用，这个类本身不是线程安全的，这样使用会造成数据混乱等问题.)
//    _db = [FMDatabase databaseWithPath:path];
//    if ([_db open])
//    {
//        //4.创表
//        BOOL result = [_db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_Student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL,score float NOT NULL);"];
//        if (result)
//        {
//            NSLog(@"创建表成功");
//        }
//    }
    
    //如果我们的app需要多线程操作数据库，那么就需要使用FMDatabaseQueue来保证线程安全了
    _DataQueue = [FMDatabaseQueue databaseQueueWithPath:path];
}

- (void)addUI{
    [self.view addSubview:self.sqliteView];
    [self.sqliteView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
    }];
}

@end
